package com.nnnu.wsnackshop.controller.user;

import com.nnnu.wsnackshop.constant.MessageConstants;
import com.nnnu.wsnackshop.exception.ObjectException;
import com.nnnu.wsnackshop.pojo.dto.StorePageDTO;
import com.nnnu.wsnackshop.pojo.vo.StoreVO;
import com.nnnu.wsnackshop.result.PageResult;
import com.nnnu.wsnackshop.result.Result;
import com.nnnu.wsnackshop.service.IStoresService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.CrossOrigin;

import java.util.List;

/**
 * <p>
 * 门店表 前端控制器
 * </p>
 *
 * @author zk
 * @since 2025-05-19
 */
@RestController("userStoresController")
@RequestMapping("/api/user/stores")
@Tag(name = "用户端-门店接口")
@Slf4j
@Validated
@RequiredArgsConstructor
public class StoresController {
    private final IStoresService storeService;

    /**
     * 分页查询用户可见门店列表（仅 status=1 的门店）。
     * 前端可传 pageNum, pageSize, name（模糊），其他查询条件视业务扩展。
     */
    @Operation(summary = "分页查询可用门店", description = "分页查询已开启的门店列表，status 强制为 1")
    @GetMapping
    @Cacheable(cacheNames = "userStorePages", key = "'page:' + #dto.pageNum + ':' + #dto.pageSize + ':' + (#dto.getName() != null ? #dto.getName() : '')")
    public Result<PageResult<StoreVO>> pageStoresForUser(@Valid @ModelAttribute StorePageDTO dto) {
        log.info("[用户端] 分页查询可用门店：{}", dto);
        // 强制只查询 status = 1（开启）的门店
        dto.setStatus(1);
        PageResult<StoreVO> page = storeService.pageStores(dto);
        return Result.success(page, MessageConstants.SELECT_OK);
    }

    /**
     * 获取单个门店详情，只有 status=1 门店可查看。若门 店不存在或未开启，返回 404 或自定义异常。
     */
    @Operation(summary = "获取门店详情", description = "仅当门店已开启(status=1)时返回详情")
    @GetMapping("/{id}")
    @Cacheable(cacheNames = "userStoreDetail", key = "'detail:' + #id")
    public Result<StoreVO> getStoreDetailForUser(@PathVariable("id") Long id) {
        log.info("[用户端] 获取门店详情 id={}", id);
        StoreVO vo = storeService.getStoreDetail(id);
        if (vo == null || vo.getStatus() == null || vo.getStatus() != 1) {
            // 可以抛出自定义异常，由全局异常处理器返回 404 或提示
            throw new ObjectException("门店不存在或未开启: " + id);
        }
        return Result.success(vo, MessageConstants.SELECT_OK);
    }

    // 如果需要不分页的全量门店列表（用于前端一次性加载），可再提供：
    /**
     * 查询所有可用门店，不分页（慎用，大量数据时需谨慎）。
     */
    @Operation(summary = "查询所有可用门店（不分页）", description = "返回所有已开启的门店列表，不分页，慎用")
    @GetMapping("/all")
    @Cacheable(cacheNames = "userStoreAll", key = "'all'")
    public Result<List<StoreVO>> listAllStoresForUser() {
        log.info("[用户端] 查询所有可用门店（不分页）");
        StorePageDTO dto = new StorePageDTO();
        dto.setPageNum(1);
        dto.setPageSize(Integer.MAX_VALUE); // 业务最大值
        dto.setStatus(1);
        PageResult<StoreVO> page = storeService.pageStores(dto);
        List<StoreVO> items = page.getItems();
        return Result.success(items, MessageConstants.SELECT_OK);
    }
}
